/*
*********************************************************************************************************
*
* 模块名称 :  rs232串口模块【原创】
* 文件名称 :  bsp_uartfifo_rs232.c
* 版    本 :  V1.0
* 说    明 :  V1.0版本用串口中断，第二版本V2.0版本用dma搬运方式
*
*
* 修改记录 :
*   版本号     日期      作者     说明
*   V1.0       2025-2-8  miaozi   正式发布
*
*
*
*********************************************************************************************************
*/

#include "bsp.h"

//  导入外部变量
extern DMA_HandleTypeDef hdma_usart1_tx;
//  导入外部变量

#define   RS232_UART  &huart1
#define   RS232_UART_DMA  &hdma_usart1_tx
#define   BUF_SIZE    32768                             //  根据样本数量适当调整，以字节为单位
__attribute__((section(".RAM_D1")))static  uint8_t            rs232_txbuf[BUF_SIZE];       //  RS232数据缓冲区
static  uint8_t            rs232_formatstrbuf[1024];
//static  uint8_t           rxbuf[BUF_SIZE];

UART_T                    g_RS232;                    //  串口FIFO操作全局句柄

static  CircularFifo_U8_T h_TxBuff;                   //  发送环形缓冲区
//static  CircularFifo_U8_T g_RxBuff;                 //  接收环形缓冲区

__attribute__((section(".RAM_D1")))uint16_t length;
//  RS232驱动初始化
void  BSP_RS232_Init(void)
{
  h_TxBuff.data     = rs232_txbuf;
  h_TxBuff.buf_size = BUF_SIZE;
  g_RS232.pTxFifo   = &h_TxBuff;

  g_RS232.g_uart    = RS232_UART;
  g_RS232.h_dma     = RS232_UART_DMA;
  g_RS232.FIFO_Init = FIFO_U8_Init;
  g_RS232.FIFO_IsEmpty  = FIFO_U8_IsEmpty;
  g_RS232.FIFO_IsFull   = FIFO_U8_IsFull;
  g_RS232.FIFO_Write    = FIFO_U8_Write;
  g_RS232.FIFO_Read     = FIFO_U8_Read;

  FIFO_U8_Init(&h_TxBuff);          //  清空队列
  return;
}

//  RS232数据传输
void  BSP_RS232_Transmit(uint8_t *_ucaBuf, uint16_t _usLen)
{
  UartSend(&g_RS232,_ucaBuf,_usLen);
  return;
}

/*
*********************************************************************************************************
* 函 数 名: BSP_RS232__Printf
* 功能说明: 串口格式化打印，V2接口
* 形    参:
* 返 回 值:
*********************************************************************************************************
*/
void BSP_RS232_Printf(char *format,...)
{
  if(format == NULL) return;            //  If the format string is empty

  uint32_t  format_size;      //  格式化字符串的长度

  //start:Processing format string
  va_list args;
  va_start(args,format);
  format_size = vsnprintf((char *)rs232_formatstrbuf,sizeof(rs232_formatstrbuf),(const char *)format, args);
  va_end(args);
  //end:Processing format string

//  UartSend(&g_RS232,rs232_formatstrbuf,format_size);      //  串口中断发送，V1
  //  start：V2
  BSP_RS232_FifoEmpty();
  for(uint8_t i=0;i<format_size;i++)
  {
    FIFO_U8_FastWrite(g_RS232.pTxFifo,rs232_formatstrbuf[i]);
  }
  BSP_RS232_FifoSendByDMA();
  //  end：V2
  return;
}

/*
*********************************************************************************************************
* 函 数 名: BSP_RS232_FifoPush
* 功能说明: 串口格式化入队, V2接口
* 形    参:
* 返 回 值:
*********************************************************************************************************
*/
void  BSP_RS232_FifoPush(char *format,...)
{
  if(format == NULL) return;  //If the format string is empty

  uint32_t  format_size;      //  格式化字符串的长度

  //start:Processing format string
  va_list args;
  va_start(args,format);
  format_size = vsnprintf((char *)rs232_formatstrbuf,sizeof(rs232_formatstrbuf),(const char *)format, args);
  va_end(args);
  //end:Processing format string

  //  格式化字符串入队
  for(uint8_t i=0;i<format_size;i++)
  {
    FIFO_U8_FastWrite(&h_TxBuff,rs232_formatstrbuf[i]);
  }

  return;
}

/*
*********************************************************************************************************
* 函 数 名: BSP_RS232_FifoSendByDMA
* 功能说明: 队列通过DMA发送，V2接口
* 形    参:
* 返 回 值:
*********************************************************************************************************
*/
void BSP_RS232_FifoSendByDMA(void)
{

//  length = FIFO_U8_LengthGet(g_RS232.pTxFifo);
  length = g_RS232.pTxFifo->head;
  HAL_UART_Transmit_DMA(g_RS232.g_uart,g_RS232.pTxFifo->data,length);
  return;
}

/*
*********************************************************************************************************
* 函 数 名: BSP_RS232_FifoEmpty
* 功能说明: 队列情况，V2接口
* 形    参:
* 返 回 值:
*********************************************************************************************************
*/
void BSP_RS232_FifoEmpty(void)
{
  FIFO_U8_Init(&h_TxBuff);          //  清空队列
  return;
}

/*
*********************************************************************************************************
* 函 数 名: BSP_RS232_IsIdle
* 功能说明: RS232是否空闲
* 形    参:
* 返 回 值:
*********************************************************************************************************
*/
uint8_t BSP_RS232_IsIdle(void)
{
//  if(HAL_UART_GetState(g_RS232.g_uart) == HAL_UART_STATE_READY)
//  {
//    if(HAL_DMA_GetState(g_RS232.h_dma) == HAL_DMA_STATE_READY)
//      return  1;
//  }
  if(__HAL_DMA_GET_COUNTER(g_RS232.h_dma) == 0)
  {
    return 1;
  }
  return 0;
}

/*
*********************************************************************************************************
* 函 数 名: BSP_RS232_Reset
* 功能说明: 复位RS232
* 形    参:
* 返 回 值:
*********************************************************************************************************
*/
void BSP_RS232_Reset(void)
{
  HAL_UART_Abort(g_RS232.g_uart);
  HAL_DMA_Abort(g_RS232.h_dma);
  FIFO_U8_Init(&h_TxBuff);          //  清空队列
  return;
}

//**************************** LinkJoin(END OF FILE) ********************************
